<?php
/*
* Этот класс предназначен для работы с картинками. Использует библиотеку GD
*/
        class CImage{
                /*
                функция ресайза
                Входные параметры:
                $src - имя исходного файла
                $desc - имя выходного файла (если указать null, то будет произведён вывод в браузер)
                $width, $height - ширина и высота выходного файла
                $quality - качество
                $resizeSmall - указывает, менять ли размеры картинки до заданных, если она меньше
                $errorString - строка, в которую записывается ошибка
                $needFormat - формат, в котором должен быть выходной файл. По умолчанию равен формату исходного
                typeOfResize - тип ресайза
                        0 - не изменять
                        1 - масштабировать по ширине
                        2 - масштабировать по высоте
                        3 - масштабировать по ширине и высоте
                        4 - жестко подгонять под указанный размер
                
                $resizeSmall - увеличивать маленькую картинку
                $needFormat  - можно указать формат выходного файла
                */
                function imgResize($src, $dest = null, $width, $height, $typeOfResize = 3, $quality = 100, $resizeSmall = false, &$errorString, $needFormat = ''){
                        
                        if (!file_exists($src)){
                                $errorString = 'Файл не существует';
                                return false;
                        }

                          $size = getimagesize($src);

                          if ($size === false){
                                  $errorString = 'Недопустимый формат файла';
                                  return false;
                          }

                          $format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));

                          $icfunc = "imagecreatefrom" . $format;
                          if (!function_exists($icfunc)){
                                  $errorString = 'На данном хостинге не допустим формат ' . $format;
                                  return false;
                          }
                        
                          //Определяем масштаб
                          switch ($typeOfResize){
							  case 0:$ratio = 1;break;                  
							  case 1:$ratio = $width / $size[0];break;
							  case 2:$ratio = $height / $size[1];break;                  
							  case 3:$ratio = self::getScale($size[0], $size[1], $width, $height);break;
							  case 4:$ratio = 1;break;
                          }
                          
                          //Если фотка маленькая и её не разрешено ресайзить, то устанавливаем масштаб 1
                          if ($ratio > 1 && !$resizeSmall){
                                  $ratio = 1;
                          }
  
                          if ($typeOfResize != 4){
                                  $new_width  = $size[0] * $ratio;
                                  $new_height  = $size[1] * $ratio;
                          } else {
                                  $new_width = $width;
                                  $new_height = $height;
                          }

                          $isrc = $icfunc($src);
                          $idest = imagecreatetruecolor($new_width, $new_height);
  
                          imagecopyresampled($idest,$isrc,0,0,0,0,$new_width, $new_height, $size[0], $size[1]);

                        //Устанавливаем формат вывода
                        $needFormat = $needFormat ? $needFormat : $format;
                        $distFunc = 'image' . $needFormat;
                        if (!function_exists($distFunc)){
                                $errorString = 'Функция ' . $distFunc . ' недоступна.';
                                return false;
                        }
                        
                        //Если не указан выходной файл - выводим в браузер
                        if (!$dest){
                             header('Content-type: image/' . $needFormat);
							   
                        }
                          $distFunc($idest, $dest, $quality);

                          imagedestroy($isrc);
                          imagedestroy($idest);

                          return true;
                }
                
                //Возвращает необходимый масштаб, чтоб уместить картинку в заданные рамки, но при этом без изменения пропорций
                function getScale($width, $height, $newWidth, $newHeight){
                        $xRatio = $newWidth / $width;
                        $yRatio = $newHeight / $height;
                        return min($xRatio, $yRatio);
                }
                
}
?>